package com.itany.corejava.code08_常用类.包装类;

/**
 * @author 石小俊
 * @version 1.0
 * @date 2023年03月16日 15:58
 */
public class Test01_定义方式 {
    public static void main(String[] args) {
        // 定义方式一:通过构造方法来定义
        byte b = 10;
        // 遇到整数时,Java默认当做int来处理
        // 需要传递byte类型的整数时,先定义后传值
        Byte b1 = new Byte(b);
        System.out.println(b1);
        Byte b2 = new Byte("10");
        System.out.println(b2);
        // 如果超出了对应类型的范围,不会像强制类型转换那样丢失精度
        // 而是直接报错:NumberFormatException
        // Byte b3 = new Byte("1000");// 报错
        // Short、Integer、Long用法与Byte一致

        // 可以使用boolean类型的参数
        Boolean flag = new Boolean(true);
        System.out.println(flag);
        // 如果参数是一个字符串,只有忽略大小写后值为true时返回true
        // 其他任意字符均返回false
        Boolean flag2 = new Boolean("admin");
        System.out.println(flag2);

        // 对于Float,其参数可以float、double、String
        Float f = new Float(3.14f); // float
        Float f2 = new Float(3.14); // double
        Float f3 = new Float("3.14"); // String
        System.out.println(f);
        System.out.println(f2);
        System.out.println(f3);
        // 对于Double,其参数可以是double、String
        Double d1 = new Double(5.12);
        Double d2 = new Double("5.12");
        System.out.println(d1);
        System.out.println(d2);


        // 对于Character,其参数只能是char类型
        Character c = new Character('A');
        System.out.println(c);

        // 方式二:通过每个包装类所提供的静态方法valueOf()进行定义
        // 方法的参数大部分与构造方法的参数一致
        Integer i1 = Integer.valueOf(10);
        Integer i2 = Integer.valueOf("10");
        System.out.println(i1);
        System.out.println(i2);
        // 当通过Integer.valueOf()方法传值时
        // 如果其值范围在:[-128,127]时
        // return IntegerCache.cache[i + (-IntegerCache.low)];
        // 即:没有new对象,而是保存在缓存中
        System.out.println(i1 == i2); // true

        // 当值不在[-128,127]之内时
        // return new Integer(i);
        // 此时创建了新的对象,保存到堆中
        Integer i3 = Integer.valueOf(1000);
        Integer i4 = Integer.valueOf(1000);
        System.out.println(i3 == i4); // false

        // 包装类具有面向对象的特征,可以调用Object的方法
        System.out.println(i3.getClass());
        System.out.println(i3.hashCode());
    }
}
